package com.tlvip.design.template;

/**
 * <p>description：
 *  模式定义：定义一个操作的算法骨架，而将一些步骤延迟到子类中，
 *  Template method 使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤</p>
 *
 *  应用场景：
 *     javax HttpServlet
 *     Spring AbstractController
 * <p>copyright： copyright(C)2016-2099</p>
 * <p>Life is short,we need passion</p>
 * <p>Summary： </p>
 * <p>instructions： </p>
 * Date 2021/8/14</p>
 * Author mac
 *
 * @version 1.0
 */
public class TemplateMethodTest {
    public static void main(String[] args) {
        AbstractClass abstractClass = new SubClass();
        abstractClass.operation();

        AbstractClass abstractClass1 = new SubClass1();
        abstractClass1.operation();
    }
}

abstract class AbstractClass {
    // 本质上是继承，子类具有父类的功能，并拓展父类功能
    public void operation() {
        System.out.println("pre ...");

        System.out.println("step1");

        System.out.println("step2");

        templateMethod();
    }

    abstract protected void templateMethod();
}

class SubClass extends AbstractClass {

    @Override
    protected void templateMethod() {
        System.out.println("subclass execute");
    }
}

class SubClass1 extends AbstractClass {

    @Override
    protected void templateMethod() {
        System.out.println("subclass1 execute");
    }
}
